package com.wise.model.content.utils;

import com.wise.model.content.enums.FileType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;

//文件类型判断类
public class FileTypeJudge {

    static Logger logger = LoggerFactory.getLogger("FileTypeJudge.class");

    /**
     * Constructor
     */
    private FileTypeJudge() {
    }

    /**
     * 将文件头转换成16进制字符串
     *
     * @return 16进制字符串
     */
    private static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 得到文件头
     * <p>
     * 文件路径
     *
     * @return 文件头
     * @throws IOException
     */
    private static String getFileContent(InputStream is) throws IOException {
        byte[] b = new byte[28];
        InputStream inputStream = null;
        try {
            is.read(b, 0, b.length);
        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    throw e;
                }
            }
        }
        return bytesToHexString(b);
    }

    /**
     * 判断文件类型
     * <p>
     * 文件路径
     *
     * @return 文件类型
     */
    public static FileType getType(InputStream is) {
        String fileHead = null;
        try {
            fileHead = getFileContent(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        logger.info("FILEHEAD=========================="+fileHead);
        if (fileHead == null || fileHead.length() == 0) {
            return null;
        }
        fileHead = fileHead.toUpperCase();
        FileType[] fileTypes = FileType.values();
        for (FileType type : fileTypes) {
            if (fileHead.startsWith(type.getValue())) {
                return type;
            }
        }
        return null;
    }

    /**
     * @param value 表示文件类型
     * @return  1 表示图片,2 表示文档,3 表示视频,4 表示种子,5 表示音乐,7 表示其它
     */
    public static Integer isFileType(FileType value) {
        Integer type = 7;// 其他
        // 图片
        FileType[] pics = {FileType.JPEG, FileType.PNG, FileType.GIF, FileType.TIFF, FileType.BMP, FileType.DWG, FileType.PSD};

        FileType[] docs = {FileType.RTF, FileType.XML, FileType.HTML, FileType.CSS, FileType.JS, FileType.EML, FileType.DBX, FileType.PST, FileType.XLS_DOC, FileType.XLSX_DOCX, FileType.VSD,
                FileType.MDB, FileType.WPS, FileType.WPD, FileType.EPS, FileType.PDF, FileType.QDF, FileType.PWL, FileType.ZIP, FileType.RAR, FileType.JSP, FileType.JAVA, FileType.CLASS,
                FileType.JAR, FileType.MF, FileType.EXE, FileType.CHM};

        FileType[] videos = {FileType.MP4,FileType.AVI, FileType.RAM, FileType.RM, FileType.MPG, FileType.MOV, FileType.ASF,FileType.FLV, FileType.MID, FileType.MKV};

        FileType[] tottents = {FileType.TORRENT};

        FileType[] audios = {FileType.WAV, FileType.MP3};

        FileType[] others = {};
        FileType[] zip ={FileType.ZIP,FileType.RAR};
        FileType[] csv ={FileType.CSV};

        // 图片
        for (FileType fileType : pics) {
            if (fileType.equals(value)) {
                type = FileTypeEnum.PIC.getType();
            }
        }
        // 文档
        for (FileType fileType : docs) {
            if (fileType.equals(value)) {
                type = FileTypeEnum.DOC.getType();
            }
        }
        // 视频
        for (FileType fileType : videos) {
            if (fileType.equals(value)) {
                type = FileTypeEnum.VIDEO.getType();
            }
        }
        // 种子
        for (FileType fileType : tottents) {
            if (fileType.equals(value)) {
                type = FileTypeEnum.TORRENT.getType();
            }
        }
        // 音乐
        for (FileType fileType : audios) {
            if (fileType.equals(value)) {
                type = FileTypeEnum.AUDIOS.getType();
            }
        }
        for (FileType fileType : zip) {
            if (fileType.equals(value)) {
                type = FileTypeEnum.ZIP.getType();
            }
        }
        for (FileType fileType : csv) {
            if (fileType.equals(value)) {
                type = FileTypeEnum.CSV.getType();
            }
        }
        return type;
    }

    /**
     * 文件类型枚举
     *
     * @author futao
     * created on 2019/04/15
     */
    public enum FileTypeEnum {
        /**
         * 1=图片
         */
        PIC(1, "图片"),
        /**
         * 2=doc文档
         */
        DOC(2, "doc文档"),
        /**
         * 3=视频
         */
        VIDEO(3, "视频"),
        /**
         * 4=种子
         */
        TORRENT(4, "种子"),
        /**
         * 5=音频
         */
        AUDIOS(5, "音频"),

        CSV(8,"CSV文件"),
        /**
         * 9=Zip,rar文件
         */
        ZIP(9,"压缩文件");

        private int type;
        private String desc;

        FileTypeEnum(int type, String desc) {
            this.type = type;
            this.desc = desc;
        }

        public int getType() {
            return type;
        }

        public String getDesc() {
            return desc;
        }
    }
}